{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 少数クラスデータの影響、データ増強、Oversamplingの比較"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from matplotlib import pyplot as plt\n",
    "import tensorboard as tb\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def calc_mean_f1_score(df):\n",
    "    \"\"\" f1 score calculator \"\"\"\n",
    "    class_names = ['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']\n",
    "    f1_mean_map = {}\n",
    "    for cls_nm in class_names:\n",
    "        f1_scores = []\n",
    "        for fold_idx in range(5):\n",
    "            f1 = df.loc[df[\"run\"]==f\"valid_fold{fold_idx+1}_f1-score_{cls_nm}\"].sort_values(by=[\"step\"], ascending=False)[\"value\"].iloc[0]\n",
    "            f1_scores.append(np.round(f1, 2))\n",
    "        f1_mean_map[cls_nm] = np.mean(f1_scores)\n",
    "    return f1_mean_map"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def calc_mean_acc_score(df):\n",
    "    acc_scores = []\n",
    "    for fold_idx in range(5):\n",
    "        acc = df.loc[df[\"run\"]==f\"valid_acc_fold{fold_idx+1}\"].sort_values(by=[\"step\"], ascending=False)[\"value\"].iloc[0]\n",
    "        acc_scores.append(acc)\n",
    "    return np.mean(acc_scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 不均衡データ vs 均衡データ"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "不均衡データ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# read results from tensorboard\n",
    "experiment_id = \"BX5GjbzkQKaXrE2xHwYAYw\"\n",
    "experiment = tb.data.experimental.ExperimentFromDev(experiment_id)\n",
    "df_imb = experiment.get_scalars()\n",
    "\n",
    "f1_mean_map_imbalance = calc_mean_f1_score(df_imb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "均衡データ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# read results from tensorboard\n",
    "experiment_id = \"onhNEOULQuOefRFrlHY37g\"\n",
    "experiment = tb.data.experimental.ExperimentFromDev(experiment_id)\n",
    "df_blc = experiment.get_scalars()\n",
    "\n",
    "# calc f1 score\n",
    "f1_mean_map_balanced = calc_mean_f1_score(df_blc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "F1スコアのランク比較"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>airplane</th>\n",
       "      <th>automobile</th>\n",
       "      <th>bird</th>\n",
       "      <th>cat</th>\n",
       "      <th>deer</th>\n",
       "      <th>dog</th>\n",
       "      <th>frog</th>\n",
       "      <th>horse</th>\n",
       "      <th>ship</th>\n",
       "      <th>truck</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Imbalanced (rank)</th>\n",
       "      <td>5.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Balanced (rank)</th>\n",
       "      <td>6.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   airplane  automobile  bird   cat  deer  dog  frog  horse  \\\n",
       "Imbalanced (rank)       5.0         1.0  10.0   9.0   8.0  7.0   3.0    4.0   \n",
       "Balanced (rank)         6.0         2.0   8.0  10.0   7.0  9.0   4.0    5.0   \n",
       "\n",
       "                   ship  truck  \n",
       "Imbalanced (rank)   2.0    6.0  \n",
       "Balanced (rank)     1.0    3.0  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_f1_comp = pd.DataFrame([f1_mean_map_imbalance, f1_mean_map_balanced], index=[\"Imbalance\", \"Balanced\"])\n",
    "summary_rank = df_f1_comp.rank(axis=1, ascending=False)\n",
    "summary_rank.index = [\"Imbalanced (rank)\", \"Balanced (rank)\"]\n",
    "summary_rank"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 少数クラスのうちbirdとdeerは、他クラスのデータ量が2500と均衡しても順位はほぼ最下位のまま→CNNにとって元々分類の苦手なクラス\n",
    "- 少数クラスのうちtruckは、他クラスのデータ量が2500と均衡したことで順位が6位から3位へ浮上→CNNにとって分類の得意なクラス"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "F1スコア比較"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>airplane</th>\n",
       "      <th>automobile</th>\n",
       "      <th>bird</th>\n",
       "      <th>cat</th>\n",
       "      <th>deer</th>\n",
       "      <th>dog</th>\n",
       "      <th>frog</th>\n",
       "      <th>horse</th>\n",
       "      <th>ship</th>\n",
       "      <th>truck</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Imbalanced (f1)</th>\n",
       "      <td>0.746</td>\n",
       "      <td>0.830</td>\n",
       "      <td>0.484</td>\n",
       "      <td>0.538</td>\n",
       "      <td>0.558</td>\n",
       "      <td>0.612</td>\n",
       "      <td>0.78</td>\n",
       "      <td>0.762</td>\n",
       "      <td>0.810</td>\n",
       "      <td>0.708</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Balanced (f1)</th>\n",
       "      <td>0.694</td>\n",
       "      <td>0.778</td>\n",
       "      <td>0.560</td>\n",
       "      <td>0.474</td>\n",
       "      <td>0.616</td>\n",
       "      <td>0.550</td>\n",
       "      <td>0.75</td>\n",
       "      <td>0.704</td>\n",
       "      <td>0.782</td>\n",
       "      <td>0.760</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Diff</th>\n",
       "      <td>-0.052</td>\n",
       "      <td>-0.052</td>\n",
       "      <td>0.076</td>\n",
       "      <td>-0.064</td>\n",
       "      <td>0.058</td>\n",
       "      <td>-0.062</td>\n",
       "      <td>-0.03</td>\n",
       "      <td>-0.058</td>\n",
       "      <td>-0.028</td>\n",
       "      <td>0.052</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 airplane  automobile   bird    cat   deer    dog  frog  \\\n",
       "Imbalanced (f1)     0.746       0.830  0.484  0.538  0.558  0.612  0.78   \n",
       "Balanced (f1)       0.694       0.778  0.560  0.474  0.616  0.550  0.75   \n",
       "Diff               -0.052      -0.052  0.076 -0.064  0.058 -0.062 -0.03   \n",
       "\n",
       "                 horse   ship  truck  \n",
       "Imbalanced (f1)  0.762  0.810  0.708  \n",
       "Balanced (f1)    0.704  0.782  0.760  \n",
       "Diff            -0.058 -0.028  0.052  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summary_f1 = pd.concat([df_f1_comp, pd.DataFrame(df_f1_comp.loc[\"Balanced\", :] - df_f1_comp.loc[\"Imbalance\", :]).transpose()], axis=0)\n",
    "summary_f1.index = [\"Imbalanced (f1)\", \"Balanced (f1)\", \"Diff\"]\n",
    "summary_f1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 均衡データセットになったことでデータ量が減ったクラスはF1スコアも減少（bird, deer, truck以外のクラス）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Validation acc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7010117530822754"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calc_mean_acc_score(df_imb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6676800131797791"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calc_mean_acc_score(df_blc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# No Aug vs Aug"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# read results from tensorboard\n",
    "experiment_id = \"BX5GjbzkQKaXrE2xHwYAYw\"\n",
    "experiment = tb.data.experimental.ExperimentFromDev(experiment_id)\n",
    "df_no_aug = experiment.get_scalars()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# read results from tensorboard\n",
    "experiment_id = \"qOPbJVEwQf6zbkLNP4Dxiw\"\n",
    "experiment = tb.data.experimental.ExperimentFromDev(experiment_id)\n",
    "df_aug = experiment.get_scalars()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>airplane</th>\n",
       "      <th>automobile</th>\n",
       "      <th>bird</th>\n",
       "      <th>cat</th>\n",
       "      <th>deer</th>\n",
       "      <th>dog</th>\n",
       "      <th>frog</th>\n",
       "      <th>horse</th>\n",
       "      <th>ship</th>\n",
       "      <th>truck</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>No Aug</th>\n",
       "      <td>0.746</td>\n",
       "      <td>0.830</td>\n",
       "      <td>0.484</td>\n",
       "      <td>0.538</td>\n",
       "      <td>0.558</td>\n",
       "      <td>0.612</td>\n",
       "      <td>0.78</td>\n",
       "      <td>0.762</td>\n",
       "      <td>0.810</td>\n",
       "      <td>0.708</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Aug</th>\n",
       "      <td>0.792</td>\n",
       "      <td>0.856</td>\n",
       "      <td>0.542</td>\n",
       "      <td>0.576</td>\n",
       "      <td>0.586</td>\n",
       "      <td>0.666</td>\n",
       "      <td>0.78</td>\n",
       "      <td>0.796</td>\n",
       "      <td>0.846</td>\n",
       "      <td>0.724</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Improvement</th>\n",
       "      <td>0.046</td>\n",
       "      <td>0.026</td>\n",
       "      <td>0.058</td>\n",
       "      <td>0.038</td>\n",
       "      <td>0.028</td>\n",
       "      <td>0.054</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.034</td>\n",
       "      <td>0.036</td>\n",
       "      <td>0.016</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             airplane  automobile   bird    cat   deer    dog  frog  horse  \\\n",
       "No Aug          0.746       0.830  0.484  0.538  0.558  0.612  0.78  0.762   \n",
       "Aug             0.792       0.856  0.542  0.576  0.586  0.666  0.78  0.796   \n",
       "Improvement     0.046       0.026  0.058  0.038  0.028  0.054  0.00  0.034   \n",
       "\n",
       "              ship  truck  \n",
       "No Aug       0.810  0.708  \n",
       "Aug          0.846  0.724  \n",
       "Improvement  0.036  0.016  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f1_mean_map_no_aug = calc_mean_f1_score(df_no_aug)\n",
    "f1_mean_map_aug = calc_mean_f1_score(df_aug)\n",
    "df_f1_comp_aug = pd.DataFrame([f1_mean_map_no_aug, f1_mean_map_aug], index=[\"No Aug\", \"Aug\"])\n",
    "summary_f1_aug = pd.concat([df_f1_comp_aug, pd.DataFrame(df_f1_comp_aug.loc[\"Aug\", :] - df_f1_comp_aug.loc[\"No Aug\", :]).transpose()], axis=0)\n",
    "summary_f1_aug.index = [\"No Aug\", \"Aug\", \"Improvement\"]\n",
    "summary_f1_aug"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgIAAAEKCAYAAABg/j08AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3deXgUVdYG8Pd0QgIhIZiwJARIWLIQCItgBMQNBkQQHUE/wQXREQeQUUTnw1E/x3EWwQWRQUUUVFQQZ1yGTVBRkBEj+xZICIZoCGFfE0KSTp/vj6rGJiRQobvTneT9PU8/dN+6VXW6ROp01a17RFVBREREdZPN1wEQERGR7zARICIiqsOYCBAREdVhTASIiIjqMCYCREREdRgTASIiojrMp4mAiAwUkUwR2S0iT1SwXERkurl8q4hc7rLsURFJF5HtIjJfROpXb/REREQ1n88SAREJAPAagBsBJAMYISLJ5brdCCDefD0I4A1z3RgADwPooaqdAAQAGF5NoRMREdUavrwikApgt6pmq2oJgI8A3FKuzy0A5qohDUBjEYk2lwUCaCAigQBCAOyrrsCJiIhqi0Af7jsGQK7L570ArrTQJ0ZV14vISwB+AVAE4EtV/bKinYjIgzCuJqBBgwbdW7Vq5aHwrXE4HLDZas5QDMbrXYzXuxivd+zateuwqjb1dRzkHb5MBKSCtvLzHVfYR0Qug3G1oA2A4wD+JSJ3q+oH53VWnQVgFgD06NFD169f717UVbRy5Upcd9111bpPdzBe72K83sV4vUNEfvZ1DOQ9vkxF9wJw/XneEudf3q+sz28A7FHVQ6paCuBTAL29GCsREVGt5MtEYB2AeBFpIyJBMAb7LSzXZyGAkebTAz0BnFDVfBi3BHqKSIiICIB+AHZWZ/BERES1gc9uDaiqXUTGA1gOY9T/HFVNF5Ex5vKZAJYCGARgN4DTAO4zl/0oIv8GsBGAHcAmmJf/iYiIyDpfjhGAqi6FcbJ3bZvp8l4BPFTJun8G8GevBkhERF6xYcOGZoGBgW8D6ARObudtDgDb7Xb7A927dz9YfqFPEwEiIqqbAgMD346KiurQtGnTYzabrfxAcfIgh8Mhhw4dSt6/f//bAG4uv5xZGBER+UKnpk2bnmQS4H02m02bNm16AsbVl/OXV3M8REREAGBjElB9zGNd4TmfiQAREVEdxkSAiIjIxbXXXtv+8OHDAVVZZ9iwYXHvvPPOZd6KyZs4WJCIiMjFqlWrdpdvczgcUFUEBFQpP6gReEWAiIj83gdpP0ek/v3rlDZPLOme+vevUz5I+znCE9v9zW9+065jx44d2rdv3/Gll15qAgAxMTEp+fn5gZmZmUFt27btePfdd7fu2LFj8k8//RQUEhLSbfTo0S2Tk5M79OrVK2Hfvn3n/aB+/PHHozt16tQhPj6+44gRI2IdDgcAIDU1NXHs2LExKSkpHeLi4jotW7YsFADsdjt+//vft+zUqVOHhISE5BdffLGJJ76bVUwEiIjIr32Q9nPEXxfviD14qjhIARw8VRz018U7Yj2RDHz44Yc56enpOzdv3rzjzTffbL5///5zfvLn5OTUv++++47s3LlzR0JCQklRUZHt8ssvP71jx46dV1111aknnniiRflt/vGPfzy4ffv2nVlZWelFRUW2jz76KNy5zG63y7Zt23ZOmTIl97nnnmsBANOmTWsSHh5etn379p1btmzZ+d577zXNyMgIcve7WcVEgIiI/Nr0FVkxxXbHOeerYrvDNn1FVoy7254yZUrzxMTE5O7du3fYv39/vfT09Pquy6Ojo0v69etX6Pxss9nwwAMPHAWA+++//8jatWtDy2/ziy++COvcuXNSQkJC8po1a8K2b9/ewLns9ttvPwYAvXv3Lty7d28QAHz99deNPv7448ikpKTkbt26dTh27Fjgjh076pffrrdwjAAREfm1Q6eKK/x1XFm7VYsXLw5btWpV2Pr16zPCwsIcqampiUVFReckHCEhIY4LbcMod/Or06dPy2OPPRb7448/7mjfvn3pxIkTW5w5c+bsNuvXr68AEBgYiLKyMgEAVZWXX375l2HDhp105/tcKl4RICIiv9Y0LLikKu1WHT9+PCA8PLwsLCzMsWnTpvpbtmxpeLF1HA4HnE8HvPvuu5GpqamnXJefPn3aBgBRUVH2EydO2BYtWnTRJwn69+9/4o033mhaXFwsALB169bgkydPVtv5mVcEiIjIrz3cLz7vr4t3xLreHggOtDke7hef5852hw0bdmLWrFlNExISktu1a3emS5cuhRdbp0GDBo709PQGHTt2jAoLCyv79NNPs12XN2nSpOyuu+46lJyc3LFly5YlVrb56KOPHs7JyQlOSUnpoKoSERFRunTp0p/c+W5VwUSAiIj82t09Y48CxliBQ6eKg5qGBZc83C8+z9l+qRo0aKDfffddVvn2vLy8bQAQHR2NrKys9PLLX3311X0A9rm2ffLJJznO99OnT983ffr0feXXW7t2babzfXR0tN25n4CAAMyYMSMPgFuJzaViIkBERH7v7p6xR9098VPFOEaAiIjIotOnT2/ydQyexkSAiIioDmMiQEREVIcxESAiIqrDmAgQERHVYUwEiIiILHj//fcbb9iwwatT/2ZmZgbFx8d3rGjZHXfcEevcv7Mwkif2yccHiYiILPj8888b2+32E927dz/ji/0vWLDgZ29sl1cEiIjI/62bHYGXElLwbOPueCkhBetme60McUhISDfn8nfeeeeyYcOGxX311VcNv/7668ZPP/10y6SkpOT09PTgNWvWNOjSpUtSQkJCcv/+/dsdOnQoADDKDf/ud79r1aNHj8S2bdt2XLVqVciAAQPaxcbGdnr44YfPVit89tlnm8fHx3eMj4/v+NxzzzVzttvtdgwdOjQuISEheeDAgW1PnTplc273u+++Cyn/HV5//fWIlJSUDklJScl33nlnrN1ur9IxYCJARET+bd3sCCz/UywKDgQBChQcCMLyP8V6Ihm4WBlip/79+xf+5je/Of63v/1tb0ZGxo6OHTsWjxo1qs0//vGPvbt27drRsWPHokmTJp09yQcFBTnWr1+fed999x26/fbb27/11lu/ZGRkpC9YsKDJ/v37A1avXh0yb968yA0bNuxcv379zrlz5zb9/vvvGwBG6eMxY8Yc2rVr146wsDDHiy++2LSy+Ddu3Fj/3//+d8T69eszMjIydthsNp05c2ZkVY4BEwEiIvJvq6bEwF587vnKXmzDqileL0NcmSNHjgScOnUqYPDgwQUAMHr06CNpaWlnSxLfeuutxwGgS5cuRe3bty+KjY0tbdCggbZq1ao4Ozs7aOXKlaGDBg063qhRI0d4eLhj8ODBx7799tswAIiKiioZMGBAIQDcc889R9asWXNeqWOnZcuWhW3fvj2kS5cuHZKSkpL/+9//NsrOzg6uyjHgGAEiIvJvBQcrLjdcWbtFlZUhdi0tXFRUJBfYRKWc5YZtNhuCg4PV2W6z2WC320VVK123fGnj8p9dqarcfvvtR1577bVLrlNw0SsCIjKxgtfvRKTrpe6U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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "for label in f1_mean_map_aug.keys():\n",
    "    plt.scatter(x=summary_f1_aug.loc[\"No Aug\", label], y=summary_f1_aug.loc[\"Improvement\", label], label=label)\n",
    "plt.xlabel(\"F1 score without augmentation\")\n",
    "plt.ylabel(\"Improvement when augmenting\")\n",
    "plt.grid()\n",
    "plt.ylim([-0.02, 0.08])\n",
    "plt.legend(bbox_to_anchor=(1.05, 1))\n",
    "plt.savefig(\"./scatter_improve_aug.png\", bbox_inches=\"tight\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7420235276222229"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# valid acc aug with oversampling\n",
    "calc_mean_acc_score(df_aug)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Aug vs Aug with oversampling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# read results from tensorboard\n",
    "experiment_id = \"qOPbJVEwQf6zbkLNP4Dxiw\"\n",
    "experiment = tb.data.experimental.ExperimentFromDev(experiment_id)\n",
    "df_aug = experiment.get_scalars()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# read results from tensorboard\n",
    "experiment_id = \"clKHr7h1Q8WArvq8VTNNqg\"\n",
    "experiment = tb.data.experimental.ExperimentFromDev(experiment_id)\n",
    "df_aug_ovsample = experiment.get_scalars()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>airplane</th>\n",
       "      <th>automobile</th>\n",
       "      <th>bird</th>\n",
       "      <th>cat</th>\n",
       "      <th>deer</th>\n",
       "      <th>dog</th>\n",
       "      <th>frog</th>\n",
       "      <th>horse</th>\n",
       "      <th>ship</th>\n",
       "      <th>truck</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Aug</th>\n",
       "      <td>0.792</td>\n",
       "      <td>0.856</td>\n",
       "      <td>0.542</td>\n",
       "      <td>0.576</td>\n",
       "      <td>0.586</td>\n",
       "      <td>0.666</td>\n",
       "      <td>0.780</td>\n",
       "      <td>0.796</td>\n",
       "      <td>0.846</td>\n",
       "      <td>0.724</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Aug+Oversample</th>\n",
       "      <td>0.786</td>\n",
       "      <td>0.862</td>\n",
       "      <td>0.586</td>\n",
       "      <td>0.564</td>\n",
       "      <td>0.648</td>\n",
       "      <td>0.664</td>\n",
       "      <td>0.784</td>\n",
       "      <td>0.808</td>\n",
       "      <td>0.846</td>\n",
       "      <td>0.698</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Improvement</th>\n",
       "      <td>-0.006</td>\n",
       "      <td>0.006</td>\n",
       "      <td>0.044</td>\n",
       "      <td>-0.012</td>\n",
       "      <td>0.062</td>\n",
       "      <td>-0.002</td>\n",
       "      <td>0.004</td>\n",
       "      <td>0.012</td>\n",
       "      <td>0.000</td>\n",
       "      <td>-0.026</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                airplane  automobile   bird    cat   deer    dog   frog  \\\n",
       "Aug                0.792       0.856  0.542  0.576  0.586  0.666  0.780   \n",
       "Aug+Oversample     0.786       0.862  0.586  0.564  0.648  0.664  0.784   \n",
       "Improvement       -0.006       0.006  0.044 -0.012  0.062 -0.002  0.004   \n",
       "\n",
       "                horse   ship  truck  \n",
       "Aug             0.796  0.846  0.724  \n",
       "Aug+Oversample  0.808  0.846  0.698  \n",
       "Improvement     0.012  0.000 -0.026  "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f1_mean_map_aug = calc_mean_f1_score(df_aug)\n",
    "f1_mean_map_aug_ovsample = calc_mean_f1_score(df_aug_ovsample)\n",
    "df_f1_comp_os = pd.DataFrame([f1_mean_map_aug, f1_mean_map_aug_ovsample], index=[\"Aug\", \"Aug+Oversample\"])\n",
    "summary_f1_os = pd.concat([df_f1_comp_os, pd.DataFrame(df_f1_comp_os.loc[\"Aug+Oversample\", :] - df_f1_comp_os.loc[\"Aug\", :]).transpose()], axis=0)\n",
    "summary_f1_os.index = [\"Aug\", \"Aug+Oversample\", \"Improvement\"]\n",
    "summary_f1_os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "for label in f1_mean_map_aug.keys():\n",
    "    plt.scatter(x=summary_f1_os.loc[\"Aug+Oversample\", label], y=summary_f1_os.loc[\"Improvement\", label], label=label)\n",
    "plt.xlabel(\"F1 score in Aug without Oversample\")\n",
    "plt.ylabel(\"Improvement when oversampling\")\n",
    "plt.grid()\n",
    "plt.ylim([-0.08, 0.08])\n",
    "plt.legend(bbox_to_anchor=(1.05, 1))\n",
    "plt.savefig(\"./scatter_improve_os.png\", bbox_inches=\"tight\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7431764602661133"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# valid acc aug with oversampling\n",
    "calc_mean_acc_score(df_aug_ovsample)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Test Acc in aug + oversampling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# read results from tensorboard\n",
    "experiment_id = \"qxAAgHKrQqOGTzEEJQlGBg\"\n",
    "experiment = tb.data.experimental.ExperimentFromDev(experiment_id)\n",
    "df_aug_ovsample_test = experiment.get_scalars()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7052000164985657"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_aug_ovsample_test.loc[df_aug_ovsample_test[\"run\"]==f\"valid_acc_fold1\"].sort_values(by=[\"step\"], ascending=False)[\"value\"].iloc[0]"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
